home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / tcclib.exe / ZMOV.ASM < prev    next >
Encoding:
Assembly Source File  |  1989-01-23  |  3.8 KB  |  164 lines

  1. name    ZMOV
  2.  
  3. ZMOV_TEXT    segment    byte public 'CODE'
  4.  
  5. assume  cs:ZMOV_TEXT,ds:Nothing
  6.  
  7. ; void far if0move(char far *dest, char far *src, unsigned len);
  8. ;   Replace len zero dest words with corresponding src words
  9. PUBLIC _if0move
  10. _if0move    proc    far
  11.     push    bp
  12.     mov    bp,sp
  13.         push    ds
  14.         push    es
  15.         push    di
  16.         push    si
  17.  
  18.         ; Load the pointers
  19.         lds     si, dword ptr [bp+10] ;source
  20.         les     di, dword ptr [bp+6]  ;destination
  21.         mov     cx, word ptr  [bp+14] ;number of bytes to move
  22.  
  23.         shr     cx,1                  ; Convert CX to words
  24.  
  25.         cld
  26.  
  27.         ; Move the data.
  28. MovLoopZm:
  29.         cmp     word ptr es:[di],0    ;test to see if it is zero
  30.         jne     SimMovZm              ;if it is not, skip move
  31.  
  32.         movsw                         ;move a word over it
  33.  
  34.         loop    MovLoopZm             ;loop to next byte
  35.  
  36.         jmp     short RetZm           ;done moving
  37.         
  38. SimMovZm:
  39.         inc     di                    ;simulate move
  40.         inc     di
  41.         inc     si
  42.         inc     si
  43.         loop    MovLoopZm
  44.  
  45. RetZm:
  46.         pop     si
  47.         pop     di
  48.         pop     es
  49.         pop     ds
  50.     pop    bp
  51.     ret    
  52. _if0move    endp
  53.  
  54.  
  55. ; void far ifn0move(char far *dest, char far *src, unsigned len);
  56. ;    Replace len dest words with corresponding non-zero src words
  57. PUBLIC _ifn0move
  58. _ifn0move       proc    far
  59.     push    bp
  60.     mov    bp,sp
  61.         push    ds
  62.         push    es
  63.         push    di
  64.         push    si
  65.  
  66.         ; Load the pointers
  67.         lds     si, dword ptr [bp+10] ;source
  68.         les     di, dword ptr [bp+6]  ;destination
  69.         mov     cx, word ptr  [bp+14] ;number of bytes to move
  70.  
  71.         shr     cx,1                  ; Convert to words
  72.  
  73.         cld
  74.  
  75.         ; Move the bytes.
  76. LoopNzm:
  77.         cmp     word ptr ds:[si],0    ;Check for Zero
  78.         je      SimMoveNzm            ;do not move a zero
  79.         movsw                         ;move the words
  80.         loop    LoopNzm
  81.         jmp     short RetNzm
  82.  
  83. SimMoveNzm:
  84.         inc     si                    ;simulate move
  85.         inc     si
  86.         inc     di
  87.         inc     di
  88.         loop    LoopNzm
  89.  
  90. RetNzm:
  91.         pop     si
  92.         pop     di
  93.         pop     es
  94.         pop     ds
  95.     pop    bp
  96.     ret    
  97. _ifn0move    endp
  98.  
  99. ; void far strtoscrn(char far *dest, char far *src, char attr, unsigned len)
  100. ;   Write upto len char/attr pairs from src and attr to dest.
  101. PUBLIC _strtoscrn
  102. _strtoscrn      proc    far
  103.         push    bp
  104.         mov     bp,sp
  105.         push    ds
  106.         push    es
  107.         push    si
  108.         push    di
  109.  
  110.         ; Load the pointers
  111.         lds     si, dword ptr [bp+10] ;source
  112.         les     di, dword ptr [bp+6]  ;destination
  113.         mov     ah, byte ptr  [bp+14] ;Attribute
  114.         mov     cx, word ptr  [bp+16] ;max. number of bytes to move
  115.  
  116.         or      cx,cx
  117.         jz      RetSts
  118.  
  119. MovLoopSts:
  120.         lodsb
  121.         or      al,al
  122.         jz      short RetSts
  123.         stosw
  124.         loop    MovLoopSts
  125.  
  126. RetSts:
  127.         pop     di
  128.         pop     si
  129.         pop     es
  130.         pop     ds
  131.         pop     bp
  132.         ret
  133. _strtoscrn      ENDP
  134.  
  135. ; void far chartoscrn(char far *dest, char ch, char attr, unsigned len)
  136. ;   Write upto len char/attr pairs from src and attr to dest.
  137. PUBLIC _chartoscrn
  138. _chartoscrn     proc    far
  139.         push    bp
  140.         mov     bp,sp
  141.         push    ds
  142.         push    di
  143.  
  144.         ; Load the pointers
  145.         les     di, dword ptr [bp+6]  ;destination
  146.         mov     al, byte ptr [bp+10]  ; Char
  147.         mov     ah, byte ptr [bp+12]  ; Attr
  148.         mov     cx, word ptr [bp+14]  ;max. number of bytes to move
  149.  
  150.         ; Move the bytes
  151.     rep stosw
  152.  
  153.         pop     di
  154.         pop     ds
  155.         pop     bp
  156.         ret
  157. _chartoscrn      ENDP
  158.  
  159.  
  160. ZMOV_TEXT       ENDS
  161.  
  162. END
  163.  
  164.